From: Keir Fraser Date: Thu, 15 Apr 2010 17:47:58 +0000 (+0100) Subject: x86_emulate: Emulate CLFLUSH instruction X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~12353 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https:/%22bookmarks://%22Dat/%22http:/www.example.com/cgi/%22https:/%22bookmarks:/%22Dat?a=commitdiff_plain;h=91b1583fbc2360b873c2ecd961202852671b380d;p=xen.git x86_emulate: Emulate CLFLUSH instruction We recently found that FreeBSD 8.0 guest failed to install and boot on Xen. The reason was that FreeBSD detected clflush feature and invoked this instruction to flush MMIO space. This caused a page fault; but x86_emulate.c failed to emulate this instruction (not supported). As a result, a page fault was detected inside FreeBSD. A similar issue was reported earlier. http://lists.xensource.com/archives/html/xen-devel/2010-03/msg00362.html From: Wei Huang Signed-off-by: Keir Fraser --- diff --git a/xen/arch/x86/x86_emulate/x86_emulate.c b/xen/arch/x86/x86_emulate/x86_emulate.c index 3449f21eab..51e199adbc 100644 --- a/xen/arch/x86/x86_emulate/x86_emulate.c +++ b/xen/arch/x86/x86_emulate/x86_emulate.c @@ -227,7 +227,8 @@ static uint8_t twobyte_table[256] = { DstMem|SrcReg|ModRM, DstMem|SrcReg|ModRM, 0, 0, /* 0xA8 - 0xAF */ ImplicitOps, ImplicitOps, 0, DstBitBase|SrcReg|ModRM, - DstMem|SrcReg|ModRM, DstMem|SrcReg|ModRM, 0, DstReg|SrcMem|ModRM, + DstMem|SrcReg|ModRM, DstMem|SrcReg|ModRM, + ImplicitOps|ModRM, DstReg|SrcMem|ModRM, /* 0xB0 - 0xB7 */ ByteOp|DstMem|SrcReg|ModRM, DstMem|SrcReg|ModRM, DstReg|SrcMem|ModRM|Mov, DstBitBase|SrcReg|ModRM, @@ -4008,6 +4009,19 @@ x86_emulate( emulate_2op_SrcV_nobyte("bts", src, dst, _regs.eflags); break; + case 0xae: /* Grp15 */ + switch ( modrm_reg & 7 ) + { + case 7: /* clflush */ + fail_if(ops->wbinvd == NULL); + if ( (rc = ops->wbinvd(ctxt)) != 0 ) + goto done; + break; + default: + goto cannot_emulate; + } + break; + case 0xaf: /* imul */ _regs.eflags &= ~(EFLG_OF|EFLG_CF); switch ( dst.bytes )